// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package tiff import ( "io" "os" ) // buffer buffers an io.Reader to satisfy io.ReaderAt. type buffer struct { r io.Reader buf []byte } func (b *buffer) ReadAt(p []byte, off int64) (int, os.Error) { o := int(off) end := o + len(p) if int64(end) != off+int64(len(p)) { return 0, os.EINVAL } m := len(b.buf) if end > m { if end > cap(b.buf) { newcap := 1024 for newcap < end { newcap *= 2 } newbuf := make([]byte, end, newcap) copy(newbuf, b.buf) b.buf = newbuf } else { b.buf = b.buf[:end] } if n, err := io.ReadFull(b.r, b.buf[m:end]); err != nil { end = m + n b.buf = b.buf[:end] return copy(p, b.buf[o:end]), err } } return copy(p, b.buf[o:end]), nil } // newReaderAt converts an io.Reader into an io.ReaderAt. func newReaderAt(r io.Reader) io.ReaderAt { if ra, ok := r.(io.ReaderAt); ok { return ra } return &buffer{ r: r, buf: make([]byte, 0, 1024), } }