go.image/tiff: Support missing Compression tag

no_compress.tiff is no_rps.tiff that was read in by go.image/tiff and written out again (with a hack to avoid creating the Compression tag on the way out).

$ tiffdump no_compress.tiff
no_compress.tiff:
Magic: 0x4949 <little-endian> Version: 0x2a
Directory 0: offset 968 (0x3c8) next 0 (0)
ImageWidth (256) SHORT (3) 1<16>
ImageLength (257) SHORT (3) 1<15>
BitsPerSample (258) SHORT (3) 4<8 8 8 8>
Photometric (262) SHORT (3) 1<2>
StripOffsets (273) LONG (4) 1<8>
SamplesPerPixel (277) SHORT (3) 1<4>
RowsPerStrip (278) SHORT (3) 1<15>
StripByteCounts (279) LONG (4) 1<960>
XResolution (282) RATIONAL (5) 1<72>
YResolution (283) RATIONAL (5) 1<72>
ResolutionUnit (296) SHORT (3) 1<2>
ExtraSamples (338) SHORT (3) 1<2>

LGTM=bsiegert, nigeltao
R=bsiegert, nigeltao
CC=golang-codereviews
https://golang.org/cl/95930044
diff --git a/testdata/no_compress.tiff b/testdata/no_compress.tiff
new file mode 100644
index 0000000..3f72b29
--- /dev/null
+++ b/testdata/no_compress.tiff
Binary files differ
diff --git a/tiff/reader.go b/tiff/reader.go
index fcb2b56..ea4f1f2 100644
--- a/tiff/reader.go
+++ b/tiff/reader.go
@@ -11,6 +11,7 @@
 	"compress/lzw"
 	"compress/zlib"
 	"encoding/binary"
+	"fmt"
 	"image"
 	"image/color"
 	"io"
@@ -553,7 +554,11 @@
 			offset := int64(blockOffsets[j*blocksAcross+i])
 			n := int64(blockCounts[j*blocksAcross+i])
 			switch d.firstVal(tCompression) {
-			case cNone:
+
+			// According to the spec, Compression does not have a default value,
+			// but some tools interpret a missing Compression value as none so we do
+			// the same.
+			case cNone, 0:
 				if b, ok := d.r.(*buffer); ok {
 					d.buf, err = b.Slice(int(offset), int(n))
 				} else {
@@ -574,7 +579,7 @@
 			case cPackBits:
 				d.buf, err = unpackBits(io.NewSectionReader(d.r, offset, n))
 			default:
-				err = UnsupportedError("compression")
+				err = UnsupportedError(fmt.Sprintf("compression value %d", d.firstVal(tCompression)))
 			}
 			if err != nil {
 				return nil, err
diff --git a/tiff/reader_test.go b/tiff/reader_test.go
index 8539e9c..d62e277 100644
--- a/tiff/reader_test.go
+++ b/tiff/reader_test.go
@@ -44,6 +44,15 @@
 	}
 }
 
+// TestNoCompression tries to decode an images that has no Compression tag.
+// This tag is mandatory, but most tools interpret a missing value as no compression.
+func TestNoCompression(t *testing.T) {
+	_, err := load("no_compress.tiff")
+	if err != nil {
+		t.Fatal(err)
+	}
+}
+
 // TestUnpackBits tests the decoding of PackBits-encoded data.
 func TestUnpackBits(t *testing.T) {
 	var unpackBitsTests = []struct {