tiff: new Options parameter for Encode.

No functional change at the moment but it will allow choosing
the compression type.

This is an incompatible, user-visible change. To get the old
behavior, callers of tiff.Encode need to add ", nil" as the
last parameter.

R=nigeltao
CC=golang-dev
https://golang.org/cl/6479044
This commit is contained in:
Benny Siegert 2012-08-23 20:16:03 +10:00 committed by Nigel Tao
parent c35a1ecb6c
commit 5198c64fc9
3 changed files with 36 additions and 5 deletions

View File

@ -108,3 +108,10 @@ const (
mRGBA mRGBA
mNRGBA mNRGBA
) )
// Compression describes the type of compression used in Options.
type CompressionType int
const (
Uncompressed CompressionType = iota
)

View File

@ -140,8 +140,32 @@ func writeIFD(w io.Writer, ifdOffset int, d []ifdEntry) error {
return err return err
} }
// Encode writes the image m to w in uncompressed 8-bit RGBA or NRGBA format. // Options are the encoding parameters.
func Encode(w io.Writer, m image.Image) error { type Options struct {
// Compression is the type of compression used.
Compression CompressionType
// Predictor determines whether a differencing predictor is used;
// if true, instead of each pixel's color, the color difference to the
// preceding one is saved. This improves the compression for certain
// types of images and compressors. For example, it works well for
// photos with Deflate compression.
Predictor bool
}
// Encode writes the image m to w. opt determines the options used for
// encoding, such as the compression type. If opt is nil, an uncompressed
// image is written.
func Encode(w io.Writer, m image.Image, opt *Options) error {
predictor := false
compression := Uncompressed
if opt != nil {
predictor = opt.Predictor
compression = opt.Compression
}
if compression != Uncompressed || predictor {
return UnsupportedError("compression type")
}
var extrasamples uint32 var extrasamples uint32
_, err := io.WriteString(w, leHeader) _, err := io.WriteString(w, leHeader)
if err != nil { if err != nil {

View File

@ -33,7 +33,7 @@ func TestRoundtrip(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
out := new(bytes.Buffer) out := new(bytes.Buffer)
err = Encode(out, img) err = Encode(out, img, nil)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -54,7 +54,7 @@ func TestRoundtrip2(t *testing.T) {
m0.Pix[i] = byte(i) m0.Pix[i] = byte(i)
} }
out := new(bytes.Buffer) out := new(bytes.Buffer)
if err := Encode(out, m0); err != nil { if err := Encode(out, m0, nil); err != nil {
t.Fatal(err) t.Fatal(err)
} }
m1, err := Decode(&buffer{buf: out.Bytes()}) m1, err := Decode(&buffer{buf: out.Bytes()})
@ -74,6 +74,6 @@ func BenchmarkEncode(b *testing.B) {
b.SetBytes(int64(s.X * s.Y * 4)) b.SetBytes(int64(s.X * s.Y * 4))
b.ResetTimer() b.ResetTimer()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
Encode(ioutil.Discard, img) Encode(ioutil.Discard, img, nil)
} }
} }