gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

reader.go (21235B)


      1 // Copyright 2019 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 //go:generate go run gen.go
      6 
      7 // Package ccitt implements a CCITT (fax) image decoder.
      8 package ccitt
      9 
     10 import (
     11 	"encoding/binary"
     12 	"errors"
     13 	"image"
     14 	"io"
     15 	"math/bits"
     16 )
     17 
     18 var (
     19 	errIncompleteCode          = errors.New("ccitt: incomplete code")
     20 	errInvalidBounds           = errors.New("ccitt: invalid bounds")
     21 	errInvalidCode             = errors.New("ccitt: invalid code")
     22 	errInvalidMode             = errors.New("ccitt: invalid mode")
     23 	errInvalidOffset           = errors.New("ccitt: invalid offset")
     24 	errMissingEOL              = errors.New("ccitt: missing End-of-Line")
     25 	errRunLengthOverflowsWidth = errors.New("ccitt: run length overflows width")
     26 	errRunLengthTooLong        = errors.New("ccitt: run length too long")
     27 	errUnsupportedMode         = errors.New("ccitt: unsupported mode")
     28 	errUnsupportedSubFormat    = errors.New("ccitt: unsupported sub-format")
     29 	errUnsupportedWidth        = errors.New("ccitt: unsupported width")
     30 )
     31 
     32 // Order specifies the bit ordering in a CCITT data stream.
     33 type Order uint32
     34 
     35 const (
     36 	// LSB means Least Significant Bits first.
     37 	LSB Order = iota
     38 	// MSB means Most Significant Bits first.
     39 	MSB
     40 )
     41 
     42 // SubFormat represents that the CCITT format consists of a number of
     43 // sub-formats. Decoding or encoding a CCITT data stream requires knowing the
     44 // sub-format context. It is not represented in the data stream per se.
     45 type SubFormat uint32
     46 
     47 const (
     48 	Group3 SubFormat = iota
     49 	Group4
     50 )
     51 
     52 // AutoDetectHeight is passed as the height argument to NewReader to indicate
     53 // that the image height (the number of rows) is not known in advance.
     54 const AutoDetectHeight = -1
     55 
     56 // Options are optional parameters.
     57 type Options struct {
     58 	// Align means that some variable-bit-width codes are byte-aligned.
     59 	Align bool
     60 	// Invert means that black is the 1 bit or 0xFF byte, and white is 0.
     61 	Invert bool
     62 }
     63 
     64 // maxWidth is the maximum (inclusive) supported width. This is a limitation of
     65 // this implementation, to guard against integer overflow, and not anything
     66 // inherent to the CCITT format.
     67 const maxWidth = 1 << 20
     68 
     69 func invertBytes(b []byte) {
     70 	for i, c := range b {
     71 		b[i] = ^c
     72 	}
     73 }
     74 
     75 func reverseBitsWithinBytes(b []byte) {
     76 	for i, c := range b {
     77 		b[i] = bits.Reverse8(c)
     78 	}
     79 }
     80 
     81 // highBits writes to dst (1 bit per pixel, most significant bit first) the
     82 // high (0x80) bits from src (1 byte per pixel). It returns the number of bytes
     83 // written and read such that dst[:d] is the packed form of src[:s].
     84 //
     85 // For example, if src starts with the 8 bytes [0x7D, 0x7E, 0x7F, 0x80, 0x81,
     86 // 0x82, 0x00, 0xFF] then 0x1D will be written to dst[0].
     87 //
     88 // If src has (8 * len(dst)) or more bytes then only len(dst) bytes are
     89 // written, (8 * len(dst)) bytes are read, and invert is ignored.
     90 //
     91 // Otherwise, if len(src) is not a multiple of 8 then the final byte written to
     92 // dst is padded with 1 bits (if invert is true) or 0 bits. If inverted, the 1s
     93 // are typically temporary, e.g. they will be flipped back to 0s by an
     94 // invertBytes call in the highBits caller, reader.Read.
     95 func highBits(dst []byte, src []byte, invert bool) (d int, s int) {
     96 	// Pack as many complete groups of 8 src bytes as we can.
     97 	n := len(src) / 8
     98 	if n > len(dst) {
     99 		n = len(dst)
    100 	}
    101 	dstN := dst[:n]
    102 	for i := range dstN {
    103 		src8 := src[i*8 : i*8+8]
    104 		dstN[i] = ((src8[0] & 0x80) >> 0) |
    105 			((src8[1] & 0x80) >> 1) |
    106 			((src8[2] & 0x80) >> 2) |
    107 			((src8[3] & 0x80) >> 3) |
    108 			((src8[4] & 0x80) >> 4) |
    109 			((src8[5] & 0x80) >> 5) |
    110 			((src8[6] & 0x80) >> 6) |
    111 			((src8[7] & 0x80) >> 7)
    112 	}
    113 	d, s = n, 8*n
    114 	dst, src = dst[d:], src[s:]
    115 
    116 	// Pack up to 7 remaining src bytes, if there's room in dst.
    117 	if (len(dst) > 0) && (len(src) > 0) {
    118 		dstByte := byte(0)
    119 		if invert {
    120 			dstByte = 0xFF >> uint(len(src))
    121 		}
    122 		for n, srcByte := range src {
    123 			dstByte |= (srcByte & 0x80) >> uint(n)
    124 		}
    125 		dst[0] = dstByte
    126 		d, s = d+1, s+len(src)
    127 	}
    128 	return d, s
    129 }
    130 
    131 type bitReader struct {
    132 	r io.Reader
    133 
    134 	// readErr is the error returned from the most recent r.Read call. As the
    135 	// io.Reader documentation says, when r.Read returns (n, err), "always
    136 	// process the n > 0 bytes returned before considering the error err".
    137 	readErr error
    138 
    139 	// order is whether to process r's bytes LSB first or MSB first.
    140 	order Order
    141 
    142 	// The high nBits bits of the bits field hold upcoming bits in MSB order.
    143 	bits  uint64
    144 	nBits uint32
    145 
    146 	// bytes[br:bw] holds bytes read from r but not yet loaded into bits.
    147 	br    uint32
    148 	bw    uint32
    149 	bytes [1024]uint8
    150 }
    151 
    152 func (b *bitReader) alignToByteBoundary() {
    153 	n := b.nBits & 7
    154 	b.bits <<= n
    155 	b.nBits -= n
    156 }
    157 
    158 // nextBitMaxNBits is the maximum possible value of bitReader.nBits after a
    159 // bitReader.nextBit call, provided that bitReader.nBits was not more than this
    160 // value before that call.
    161 //
    162 // Note that the decode function can unread bits, which can temporarily set the
    163 // bitReader.nBits value above nextBitMaxNBits.
    164 const nextBitMaxNBits = 31
    165 
    166 func (b *bitReader) nextBit() (uint64, error) {
    167 	for {
    168 		if b.nBits > 0 {
    169 			bit := b.bits >> 63
    170 			b.bits <<= 1
    171 			b.nBits--
    172 			return bit, nil
    173 		}
    174 
    175 		if available := b.bw - b.br; available >= 4 {
    176 			// Read 32 bits, even though b.bits is a uint64, since the decode
    177 			// function may need to unread up to maxCodeLength bits, putting
    178 			// them back in the remaining (64 - 32) bits. TestMaxCodeLength
    179 			// checks that the generated maxCodeLength constant fits.
    180 			//
    181 			// If changing the Uint32 call, also change nextBitMaxNBits.
    182 			b.bits = uint64(binary.BigEndian.Uint32(b.bytes[b.br:])) << 32
    183 			b.br += 4
    184 			b.nBits = 32
    185 			continue
    186 		} else if available > 0 {
    187 			b.bits = uint64(b.bytes[b.br]) << (7 * 8)
    188 			b.br++
    189 			b.nBits = 8
    190 			continue
    191 		}
    192 
    193 		if b.readErr != nil {
    194 			return 0, b.readErr
    195 		}
    196 
    197 		n, err := b.r.Read(b.bytes[:])
    198 		b.br = 0
    199 		b.bw = uint32(n)
    200 		b.readErr = err
    201 
    202 		if b.order != MSB {
    203 			reverseBitsWithinBytes(b.bytes[:b.bw])
    204 		}
    205 	}
    206 }
    207 
    208 func decode(b *bitReader, decodeTable [][2]int16) (uint32, error) {
    209 	nBitsRead, bitsRead, state := uint32(0), uint64(0), int32(1)
    210 	for {
    211 		bit, err := b.nextBit()
    212 		if err != nil {
    213 			if err == io.EOF {
    214 				err = errIncompleteCode
    215 			}
    216 			return 0, err
    217 		}
    218 		bitsRead |= bit << (63 - nBitsRead)
    219 		nBitsRead++
    220 
    221 		// The "&1" is redundant, but can eliminate a bounds check.
    222 		state = int32(decodeTable[state][bit&1])
    223 		if state < 0 {
    224 			return uint32(^state), nil
    225 		} else if state == 0 {
    226 			// Unread the bits we've read, then return errInvalidCode.
    227 			b.bits = (b.bits >> nBitsRead) | bitsRead
    228 			b.nBits += nBitsRead
    229 			return 0, errInvalidCode
    230 		}
    231 	}
    232 }
    233 
    234 // decodeEOL decodes the 12-bit EOL code 0000_0000_0001.
    235 func decodeEOL(b *bitReader) error {
    236 	nBitsRead, bitsRead := uint32(0), uint64(0)
    237 	for {
    238 		bit, err := b.nextBit()
    239 		if err != nil {
    240 			if err == io.EOF {
    241 				err = errMissingEOL
    242 			}
    243 			return err
    244 		}
    245 		bitsRead |= bit << (63 - nBitsRead)
    246 		nBitsRead++
    247 
    248 		if nBitsRead < 12 {
    249 			if bit&1 == 0 {
    250 				continue
    251 			}
    252 		} else if bit&1 != 0 {
    253 			return nil
    254 		}
    255 
    256 		// Unread the bits we've read, then return errMissingEOL.
    257 		b.bits = (b.bits >> nBitsRead) | bitsRead
    258 		b.nBits += nBitsRead
    259 		return errMissingEOL
    260 	}
    261 }
    262 
    263 type reader struct {
    264 	br        bitReader
    265 	subFormat SubFormat
    266 
    267 	// width is the image width in pixels.
    268 	width int
    269 
    270 	// rowsRemaining starts at the image height in pixels, when the reader is
    271 	// driven through the io.Reader interface, and decrements to zero as rows
    272 	// are decoded. Alternatively, it may be negative if the image height is
    273 	// not known in advance at the time of the NewReader call.
    274 	//
    275 	// When driven through DecodeIntoGray, this field is unused.
    276 	rowsRemaining int
    277 
    278 	// curr and prev hold the current and previous rows. Each element is either
    279 	// 0x00 (black) or 0xFF (white).
    280 	//
    281 	// prev may be nil, when processing the first row.
    282 	curr []byte
    283 	prev []byte
    284 
    285 	// ri is the read index. curr[:ri] are those bytes of curr that have been
    286 	// passed along via the Read method.
    287 	//
    288 	// When the reader is driven through DecodeIntoGray, instead of through the
    289 	// io.Reader interface, this field is unused.
    290 	ri int
    291 
    292 	// wi is the write index. curr[:wi] are those bytes of curr that have
    293 	// already been decoded via the decodeRow method.
    294 	//
    295 	// What this implementation calls wi is roughly equivalent to what the spec
    296 	// calls the a0 index.
    297 	wi int
    298 
    299 	// These fields are copied from the *Options (which may be nil).
    300 	align  bool
    301 	invert bool
    302 
    303 	// atStartOfRow is whether we have just started the row. Some parts of the
    304 	// spec say to treat this situation as if "wi = -1".
    305 	atStartOfRow bool
    306 
    307 	// penColorIsWhite is whether the next run is black or white.
    308 	penColorIsWhite bool
    309 
    310 	// seenStartOfImage is whether we've called the startDecode method.
    311 	seenStartOfImage bool
    312 
    313 	// truncated is whether the input is missing the final 6 consecutive EOL's
    314 	// (for Group3) or 2 consecutive EOL's (for Group4). Omitting that trailer
    315 	// (but otherwise padding to a byte boundary, with either all 0 bits or all
    316 	// 1 bits) is invalid according to the spec, but happens in practice when
    317 	// exporting from Adobe Acrobat to TIFF + CCITT. This package silently
    318 	// ignores the format error for CCITT input that has been truncated in that
    319 	// fashion, returning the full decoded image.
    320 	//
    321 	// Detecting trailer truncation (just after the final row of pixels)
    322 	// requires knowing which row is the final row, and therefore does not
    323 	// trigger if the image height is not known in advance.
    324 	truncated bool
    325 
    326 	// readErr is a sticky error for the Read method.
    327 	readErr error
    328 }
    329 
    330 func (z *reader) Read(p []byte) (int, error) {
    331 	if z.readErr != nil {
    332 		return 0, z.readErr
    333 	}
    334 	originalP := p
    335 
    336 	for len(p) > 0 {
    337 		// Allocate buffers (and decode any start-of-image codes), if
    338 		// processing the first or second row.
    339 		if z.curr == nil {
    340 			if !z.seenStartOfImage {
    341 				if z.readErr = z.startDecode(); z.readErr != nil {
    342 					break
    343 				}
    344 				z.atStartOfRow = true
    345 			}
    346 			z.curr = make([]byte, z.width)
    347 		}
    348 
    349 		// Decode the next row, if necessary.
    350 		if z.atStartOfRow {
    351 			if z.rowsRemaining < 0 {
    352 				// We do not know the image height in advance. See if the next
    353 				// code is an EOL. If it is, it is consumed. If it isn't, the
    354 				// bitReader shouldn't advance along the bit stream, and we
    355 				// simply decode another row of pixel data.
    356 				//
    357 				// For the Group4 subFormat, we may need to align to a byte
    358 				// boundary. For the Group3 subFormat, the previous z.decodeRow
    359 				// call (or z.startDecode call) has already consumed one of the
    360 				// 6 consecutive EOL's. The next EOL is actually the second of
    361 				// 6, in the middle, and we shouldn't align at that point.
    362 				if z.align && (z.subFormat == Group4) {
    363 					z.br.alignToByteBoundary()
    364 				}
    365 
    366 				if err := z.decodeEOL(); err == errMissingEOL {
    367 					// No-op. It's another row of pixel data.
    368 				} else if err != nil {
    369 					z.readErr = err
    370 					break
    371 				} else {
    372 					if z.readErr = z.finishDecode(true); z.readErr != nil {
    373 						break
    374 					}
    375 					z.readErr = io.EOF
    376 					break
    377 				}
    378 
    379 			} else if z.rowsRemaining == 0 {
    380 				// We do know the image height in advance, and we have already
    381 				// decoded exactly that many rows.
    382 				if z.readErr = z.finishDecode(false); z.readErr != nil {
    383 					break
    384 				}
    385 				z.readErr = io.EOF
    386 				break
    387 
    388 			} else {
    389 				z.rowsRemaining--
    390 			}
    391 
    392 			if z.readErr = z.decodeRow(z.rowsRemaining == 0); z.readErr != nil {
    393 				break
    394 			}
    395 		}
    396 
    397 		// Pack from z.curr (1 byte per pixel) to p (1 bit per pixel).
    398 		packD, packS := highBits(p, z.curr[z.ri:], z.invert)
    399 		p = p[packD:]
    400 		z.ri += packS
    401 
    402 		// Prepare to decode the next row, if necessary.
    403 		if z.ri == len(z.curr) {
    404 			z.ri, z.curr, z.prev = 0, z.prev, z.curr
    405 			z.atStartOfRow = true
    406 		}
    407 	}
    408 
    409 	n := len(originalP) - len(p)
    410 	if z.invert {
    411 		invertBytes(originalP[:n])
    412 	}
    413 	return n, z.readErr
    414 }
    415 
    416 func (z *reader) penColor() byte {
    417 	if z.penColorIsWhite {
    418 		return 0xFF
    419 	}
    420 	return 0x00
    421 }
    422 
    423 func (z *reader) startDecode() error {
    424 	switch z.subFormat {
    425 	case Group3:
    426 		if err := z.decodeEOL(); err != nil {
    427 			return err
    428 		}
    429 
    430 	case Group4:
    431 		// No-op.
    432 
    433 	default:
    434 		return errUnsupportedSubFormat
    435 	}
    436 
    437 	z.seenStartOfImage = true
    438 	return nil
    439 }
    440 
    441 func (z *reader) finishDecode(alreadySeenEOL bool) error {
    442 	numberOfEOLs := 0
    443 	switch z.subFormat {
    444 	case Group3:
    445 		if z.truncated {
    446 			return nil
    447 		}
    448 		// The stream ends with a RTC (Return To Control) of 6 consecutive
    449 		// EOL's, but we should have already just seen an EOL, either in
    450 		// z.startDecode (for a zero-height image) or in z.decodeRow.
    451 		numberOfEOLs = 5
    452 
    453 	case Group4:
    454 		autoDetectHeight := z.rowsRemaining < 0
    455 		if autoDetectHeight {
    456 			// Aligning to a byte boundary was already handled by reader.Read.
    457 		} else if z.align {
    458 			z.br.alignToByteBoundary()
    459 		}
    460 		// The stream ends with two EOL's. If the first one is missing, and we
    461 		// had an explicit image height, we just assume that the trailing two
    462 		// EOL's were truncated and return a nil error.
    463 		if err := z.decodeEOL(); err != nil {
    464 			if (err == errMissingEOL) && !autoDetectHeight {
    465 				z.truncated = true
    466 				return nil
    467 			}
    468 			return err
    469 		}
    470 		numberOfEOLs = 1
    471 
    472 	default:
    473 		return errUnsupportedSubFormat
    474 	}
    475 
    476 	if alreadySeenEOL {
    477 		numberOfEOLs--
    478 	}
    479 	for ; numberOfEOLs > 0; numberOfEOLs-- {
    480 		if err := z.decodeEOL(); err != nil {
    481 			return err
    482 		}
    483 	}
    484 	return nil
    485 }
    486 
    487 func (z *reader) decodeEOL() error {
    488 	return decodeEOL(&z.br)
    489 }
    490 
    491 func (z *reader) decodeRow(finalRow bool) error {
    492 	z.wi = 0
    493 	z.atStartOfRow = true
    494 	z.penColorIsWhite = true
    495 
    496 	if z.align {
    497 		z.br.alignToByteBoundary()
    498 	}
    499 
    500 	switch z.subFormat {
    501 	case Group3:
    502 		for ; z.wi < len(z.curr); z.atStartOfRow = false {
    503 			if err := z.decodeRun(); err != nil {
    504 				return err
    505 			}
    506 		}
    507 		err := z.decodeEOL()
    508 		if finalRow && (err == errMissingEOL) {
    509 			z.truncated = true
    510 			return nil
    511 		}
    512 		return err
    513 
    514 	case Group4:
    515 		for ; z.wi < len(z.curr); z.atStartOfRow = false {
    516 			mode, err := decode(&z.br, modeDecodeTable[:])
    517 			if err != nil {
    518 				return err
    519 			}
    520 			rm := readerMode{}
    521 			if mode < uint32(len(readerModes)) {
    522 				rm = readerModes[mode]
    523 			}
    524 			if rm.function == nil {
    525 				return errInvalidMode
    526 			}
    527 			if err := rm.function(z, rm.arg); err != nil {
    528 				return err
    529 			}
    530 		}
    531 		return nil
    532 	}
    533 
    534 	return errUnsupportedSubFormat
    535 }
    536 
    537 func (z *reader) decodeRun() error {
    538 	table := blackDecodeTable[:]
    539 	if z.penColorIsWhite {
    540 		table = whiteDecodeTable[:]
    541 	}
    542 
    543 	total := 0
    544 	for {
    545 		n, err := decode(&z.br, table)
    546 		if err != nil {
    547 			return err
    548 		}
    549 		if n > maxWidth {
    550 			panic("unreachable")
    551 		}
    552 		total += int(n)
    553 		if total > maxWidth {
    554 			return errRunLengthTooLong
    555 		}
    556 		// Anything 0x3F or below is a terminal code.
    557 		if n <= 0x3F {
    558 			break
    559 		}
    560 	}
    561 
    562 	if total > (len(z.curr) - z.wi) {
    563 		return errRunLengthOverflowsWidth
    564 	}
    565 	dst := z.curr[z.wi : z.wi+total]
    566 	penColor := z.penColor()
    567 	for i := range dst {
    568 		dst[i] = penColor
    569 	}
    570 	z.wi += total
    571 	z.penColorIsWhite = !z.penColorIsWhite
    572 
    573 	return nil
    574 }
    575 
    576 // The various modes' semantics are based on determining a row of pixels'
    577 // "changing elements": those pixels whose color differs from the one on its
    578 // immediate left.
    579 //
    580 // The row above the first row is implicitly all white. Similarly, the column
    581 // to the left of the first column is implicitly all white.
    582 //
    583 // For example, here's Figure 1 in "ITU-T Recommendation T.6", where the
    584 // current and previous rows contain black (B) and white (w) pixels. The a?
    585 // indexes point into curr, the b? indexes point into prev.
    586 //
    587 //                 b1 b2
    588 //                 v  v
    589 // prev: BBBBBwwwwwBBBwwwww
    590 // curr: BBBwwwwwBBBBBBwwww
    591 //          ^    ^     ^
    592 //          a0   a1    a2
    593 //
    594 // a0 is the "reference element" or current decoder position, roughly
    595 // equivalent to what this implementation calls reader.wi.
    596 //
    597 // a1 is the next changing element to the right of a0, on the "coding line"
    598 // (the current row).
    599 //
    600 // a2 is the next changing element to the right of a1, again on curr.
    601 //
    602 // b1 is the first changing element on the "reference line" (the previous row)
    603 // to the right of a0 and of opposite color to a0.
    604 //
    605 // b2 is the next changing element to the right of b1, again on prev.
    606 //
    607 // The various modes calculate a1 (and a2, for modeH):
    608 //  - modePass calculates that a1 is at or to the right of b2.
    609 //  - modeH    calculates a1 and a2 without considering b1 or b2.
    610 //  - modeV*   calculates a1 to be b1 plus an adjustment (between -3 and +3).
    611 
    612 const (
    613 	findB1 = false
    614 	findB2 = true
    615 )
    616 
    617 // findB finds either the b1 or b2 value.
    618 func (z *reader) findB(whichB bool) int {
    619 	// The initial row is a special case. The previous row is implicitly all
    620 	// white, so that there are no changing pixel elements. We return b1 or b2
    621 	// to be at the end of the row.
    622 	if len(z.prev) != len(z.curr) {
    623 		return len(z.curr)
    624 	}
    625 
    626 	i := z.wi
    627 
    628 	if z.atStartOfRow {
    629 		// a0 is implicitly at -1, on a white pixel. b1 is the first black
    630 		// pixel in the previous row. b2 is the first white pixel after that.
    631 		for ; (i < len(z.prev)) && (z.prev[i] == 0xFF); i++ {
    632 		}
    633 		if whichB == findB2 {
    634 			for ; (i < len(z.prev)) && (z.prev[i] == 0x00); i++ {
    635 			}
    636 		}
    637 		return i
    638 	}
    639 
    640 	// As per figure 1 above, assume that the current pen color is white.
    641 	// First, walk past every contiguous black pixel in prev, starting at a0.
    642 	oppositeColor := ^z.penColor()
    643 	for ; (i < len(z.prev)) && (z.prev[i] == oppositeColor); i++ {
    644 	}
    645 
    646 	// Then walk past every contiguous white pixel.
    647 	penColor := ^oppositeColor
    648 	for ; (i < len(z.prev)) && (z.prev[i] == penColor); i++ {
    649 	}
    650 
    651 	// We're now at a black pixel (or at the end of the row). That's b1.
    652 	if whichB == findB2 {
    653 		// If we're looking for b2, walk past every contiguous black pixel
    654 		// again.
    655 		oppositeColor := ^penColor
    656 		for ; (i < len(z.prev)) && (z.prev[i] == oppositeColor); i++ {
    657 		}
    658 	}
    659 
    660 	return i
    661 }
    662 
    663 type readerMode struct {
    664 	function func(z *reader, arg int) error
    665 	arg      int
    666 }
    667 
    668 var readerModes = [...]readerMode{
    669 	modePass: {function: readerModePass},
    670 	modeH:    {function: readerModeH},
    671 	modeV0:   {function: readerModeV, arg: +0},
    672 	modeVR1:  {function: readerModeV, arg: +1},
    673 	modeVR2:  {function: readerModeV, arg: +2},
    674 	modeVR3:  {function: readerModeV, arg: +3},
    675 	modeVL1:  {function: readerModeV, arg: -1},
    676 	modeVL2:  {function: readerModeV, arg: -2},
    677 	modeVL3:  {function: readerModeV, arg: -3},
    678 	modeExt:  {function: readerModeExt},
    679 }
    680 
    681 func readerModePass(z *reader, arg int) error {
    682 	b2 := z.findB(findB2)
    683 	if (b2 < z.wi) || (len(z.curr) < b2) {
    684 		return errInvalidOffset
    685 	}
    686 	dst := z.curr[z.wi:b2]
    687 	penColor := z.penColor()
    688 	for i := range dst {
    689 		dst[i] = penColor
    690 	}
    691 	z.wi = b2
    692 	return nil
    693 }
    694 
    695 func readerModeH(z *reader, arg int) error {
    696 	// The first iteration finds a1. The second finds a2.
    697 	for i := 0; i < 2; i++ {
    698 		if err := z.decodeRun(); err != nil {
    699 			return err
    700 		}
    701 	}
    702 	return nil
    703 }
    704 
    705 func readerModeV(z *reader, arg int) error {
    706 	a1 := z.findB(findB1) + arg
    707 	if (a1 < z.wi) || (len(z.curr) < a1) {
    708 		return errInvalidOffset
    709 	}
    710 	dst := z.curr[z.wi:a1]
    711 	penColor := z.penColor()
    712 	for i := range dst {
    713 		dst[i] = penColor
    714 	}
    715 	z.wi = a1
    716 	z.penColorIsWhite = !z.penColorIsWhite
    717 	return nil
    718 }
    719 
    720 func readerModeExt(z *reader, arg int) error {
    721 	return errUnsupportedMode
    722 }
    723 
    724 // DecodeIntoGray decodes the CCITT-formatted data in r into dst.
    725 //
    726 // It returns an error if dst's width and height don't match the implied width
    727 // and height of CCITT-formatted data.
    728 func DecodeIntoGray(dst *image.Gray, r io.Reader, order Order, sf SubFormat, opts *Options) error {
    729 	bounds := dst.Bounds()
    730 	if (bounds.Dx() < 0) || (bounds.Dy() < 0) {
    731 		return errInvalidBounds
    732 	}
    733 	if bounds.Dx() > maxWidth {
    734 		return errUnsupportedWidth
    735 	}
    736 
    737 	z := reader{
    738 		br:        bitReader{r: r, order: order},
    739 		subFormat: sf,
    740 		align:     (opts != nil) && opts.Align,
    741 		invert:    (opts != nil) && opts.Invert,
    742 		width:     bounds.Dx(),
    743 	}
    744 	if err := z.startDecode(); err != nil {
    745 		return err
    746 	}
    747 
    748 	width := bounds.Dx()
    749 	for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
    750 		p := (y - bounds.Min.Y) * dst.Stride
    751 		z.curr = dst.Pix[p : p+width]
    752 		if err := z.decodeRow(y+1 == bounds.Max.Y); err != nil {
    753 			return err
    754 		}
    755 		z.curr, z.prev = nil, z.curr
    756 	}
    757 
    758 	if err := z.finishDecode(false); err != nil {
    759 		return err
    760 	}
    761 
    762 	if z.invert {
    763 		for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
    764 			p := (y - bounds.Min.Y) * dst.Stride
    765 			invertBytes(dst.Pix[p : p+width])
    766 		}
    767 	}
    768 
    769 	return nil
    770 }
    771 
    772 // NewReader returns an io.Reader that decodes the CCITT-formatted data in r.
    773 // The resultant byte stream is one bit per pixel (MSB first), with 1 meaning
    774 // white and 0 meaning black. Each row in the result is byte-aligned.
    775 //
    776 // A negative height, such as passing AutoDetectHeight, means that the image
    777 // height is not known in advance. A negative width is invalid.
    778 func NewReader(r io.Reader, order Order, sf SubFormat, width int, height int, opts *Options) io.Reader {
    779 	readErr := error(nil)
    780 	if width < 0 {
    781 		readErr = errInvalidBounds
    782 	} else if width > maxWidth {
    783 		readErr = errUnsupportedWidth
    784 	}
    785 
    786 	return &reader{
    787 		br:            bitReader{r: r, order: order},
    788 		subFormat:     sf,
    789 		align:         (opts != nil) && opts.Align,
    790 		invert:        (opts != nil) && opts.Invert,
    791 		width:         width,
    792 		rowsRemaining: height,
    793 		readErr:       readErr,
    794 	}
    795 }