mirror of
https://github.com/golang/go
synced 2024-11-25 10:07:56 -07:00
image: introduce Decode and RegisterFormat.
R=r, rsc CC=golang-dev https://golang.org/cl/1849054
This commit is contained in:
parent
844a86317d
commit
893fdbbe5d
@ -7,6 +7,7 @@ include ../../Make.$(GOARCH)
|
|||||||
TARG=image
|
TARG=image
|
||||||
GOFILES=\
|
GOFILES=\
|
||||||
color.go\
|
color.go\
|
||||||
|
format.go\
|
||||||
image.go\
|
image.go\
|
||||||
names.go\
|
names.go\
|
||||||
|
|
||||||
|
73
src/pkg/image/format.go
Normal file
73
src/pkg/image/format.go
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
// Copyright 2010 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 image
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// An UnknownFormatErr indicates that decoding encountered an unknown format.
|
||||||
|
var UnknownFormatErr = os.NewError("image: unknown format")
|
||||||
|
|
||||||
|
// A format holds an image format's name, magic header and how to decode it.
|
||||||
|
type format struct {
|
||||||
|
name, magic string
|
||||||
|
decode func(io.Reader) (Image, os.Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Formats is the list of registered formats.
|
||||||
|
var formats []format
|
||||||
|
|
||||||
|
// RegisterFormat registers an image format for use by Decode.
|
||||||
|
// Name is the name of the format, like "jpeg" or "png".
|
||||||
|
// Magic is the magic prefix that identifies the format's encoding.
|
||||||
|
// Decode is the function that decodes the encoded image.
|
||||||
|
func RegisterFormat(name, magic string, decode func(io.Reader) (Image, os.Error)) {
|
||||||
|
n := len(formats)
|
||||||
|
if n == cap(formats) {
|
||||||
|
x := make([]format, n+1, 2*n+4)
|
||||||
|
copy(x, formats)
|
||||||
|
formats = x
|
||||||
|
} else {
|
||||||
|
formats = formats[0 : n+1]
|
||||||
|
}
|
||||||
|
formats[n] = format{name, magic, decode}
|
||||||
|
}
|
||||||
|
|
||||||
|
// A reader is an io.Reader that can also peek ahead.
|
||||||
|
type reader interface {
|
||||||
|
io.Reader
|
||||||
|
Peek(int) ([]byte, os.Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AsReader converts an io.Reader to a reader.
|
||||||
|
func asReader(r io.Reader) reader {
|
||||||
|
if rr, ok := r.(reader); ok {
|
||||||
|
return rr
|
||||||
|
}
|
||||||
|
return bufio.NewReader(r)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decode decodes an image that has been encoded in a registered format.
|
||||||
|
// Format registration is typically done by the init method of the codec-
|
||||||
|
// specific package.
|
||||||
|
func Decode(r io.Reader) (m Image, formatName string, err os.Error) {
|
||||||
|
var f format
|
||||||
|
rr := asReader(r)
|
||||||
|
for _, g := range formats {
|
||||||
|
s, err := rr.Peek(len(g.magic))
|
||||||
|
if err == nil && string(s) == g.magic {
|
||||||
|
f = g
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if f.decode == nil {
|
||||||
|
return nil, "", UnknownFormatErr
|
||||||
|
}
|
||||||
|
m, err = f.decode(rr)
|
||||||
|
return m, f.name, err
|
||||||
|
}
|
@ -432,3 +432,7 @@ func Decode(r io.Reader) (image.Image, os.Error) {
|
|||||||
}
|
}
|
||||||
return d.image, nil
|
return d.image, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
image.RegisterFormat("jpeg", "\xff\xd8", Decode)
|
||||||
|
}
|
||||||
|
@ -464,3 +464,7 @@ func Decode(r io.Reader) (image.Image, os.Error) {
|
|||||||
}
|
}
|
||||||
return d.image, nil
|
return d.image, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
image.RegisterFormat("png", pngHeader, Decode)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user