| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- // Copyright 2014 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 riff_test
- import (
- "fmt"
- "io"
- "io/ioutil"
- "log"
- "strings"
- "golang.org/x/image/riff"
- )
- func ExampleReader() {
- formType, r, err := riff.NewReader(strings.NewReader(data))
- if err != nil {
- log.Fatal(err)
- }
- fmt.Printf("RIFF(%s)\n", formType)
- if err := dump(r, ".\t"); err != nil {
- log.Fatal(err)
- }
- // Output:
- // RIFF(ROOT)
- // . ZERO ""
- // . ONE "a"
- // . LIST(META)
- // . . LIST(GOOD)
- // . . . ONE "a"
- // . . . FIVE "klmno"
- // . . ZERO ""
- // . . LIST(BAD )
- // . . . THRE "def"
- // . TWO "bc"
- // . LIST(UGLY)
- // . . FOUR "ghij"
- // . . SIX "pqrstu"
- }
- func dump(r *riff.Reader, indent string) error {
- for {
- chunkID, chunkLen, chunkData, err := r.Next()
- if err == io.EOF {
- return nil
- }
- if err != nil {
- return err
- }
- if chunkID == riff.LIST {
- listType, list, err := riff.NewListReader(chunkLen, chunkData)
- if err != nil {
- return err
- }
- fmt.Printf("%sLIST(%s)\n", indent, listType)
- if err := dump(list, indent+".\t"); err != nil {
- return err
- }
- continue
- }
- b, err := ioutil.ReadAll(chunkData)
- if err != nil {
- return err
- }
- fmt.Printf("%s%s %q\n", indent, chunkID, b)
- }
- }
- func encodeU32(u uint32) string {
- return string([]byte{
- byte(u >> 0),
- byte(u >> 8),
- byte(u >> 16),
- byte(u >> 24),
- })
- }
- func encode(chunkID, contents string) string {
- n := len(contents)
- if n&1 == 1 {
- contents += "\x00"
- }
- return chunkID + encodeU32(uint32(n)) + contents
- }
- func encodeMulti(typ0, typ1 string, chunks ...string) string {
- n := 4
- for _, c := range chunks {
- n += len(c)
- }
- s := typ0 + encodeU32(uint32(n)) + typ1
- for _, c := range chunks {
- s += c
- }
- return s
- }
- var (
- d0 = encode("ZERO", "")
- d1 = encode("ONE ", "a")
- d2 = encode("TWO ", "bc")
- d3 = encode("THRE", "def")
- d4 = encode("FOUR", "ghij")
- d5 = encode("FIVE", "klmno")
- d6 = encode("SIX ", "pqrstu")
- l0 = encodeMulti("LIST", "GOOD", d1, d5)
- l1 = encodeMulti("LIST", "BAD ", d3)
- l2 = encodeMulti("LIST", "UGLY", d4, d6)
- l01 = encodeMulti("LIST", "META", l0, d0, l1)
- data = encodeMulti("RIFF", "ROOT", d0, d1, l01, d2, l2)
- )
|