git.lucas.co / go_mono
git clone https://git.lucas.co/go_mono.git

ccitt/reader.go (20.7K)

  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 }