limage - xcf/paths.go
1 package xcf
2
3 import "errors"
4
5 type paths struct {
6 aIndex uint32
7 paths []path
8 }
9
10 type path struct {
11 name string
12 linked bool
13 //state byte
14 closed bool
15 //version uint32
16 tattoo uint32
17 points []pathPoint
18 }
19
20 type pathPoint struct {
21 control bool
22 x, y float64
23 }
24
25 func (d *reader) ReadPaths() paths {
26 var p paths
27 p.aIndex = d.ReadUint32()
28 n := d.ReadUint32()
29 p.paths = make([]path, n)
30 for i := uint32(0); i < n; i++ {
31 p.paths[i].name = d.ReadString()
32 p.paths[i].linked = d.ReadBoolProperty()
33 state := d.ReadUint8()
34 p.paths[i].closed = d.ReadBoolProperty()
35 if p.paths[i].closed {
36 if state != 4 {
37 d.SetError(ErrInconsistantClosedState)
38 return p
39 }
40 } else {
41 if state != 2 {
42 d.SetError(ErrInconsistantClosedState)
43 return p
44 }
45 }
46 np := d.ReadUint32()
47 v := d.ReadUint32()
48 if v < 1 || v > 3 {
49 d.SetError(ErrUnknownPathsVersion)
50 return p
51 }
52 if v == 2 || v == 3 {
53 d.SkipUint32()
54 }
55 if v == 3 {
56 p.paths[i].tattoo = d.ReadUint32()
57 }
58 p.paths[i].points = make([]pathPoint, np)
59 for j := uint32(0); j < np; j++ {
60 p.paths[i].points[j].control = d.ReadBoolProperty()
61 if v == 1 {
62 p.paths[i].points[j].x = float64(d.ReadInt32())
63 p.paths[i].points[j].y = float64(d.ReadInt32())
64 } else {
65 p.paths[i].points[j].x = float64(d.ReadFloat32())
66 p.paths[i].points[j].y = float64(d.ReadFloat32())
67 }
68 }
69 }
70 return p
71 }
72
73 // Errors
74 var (
75 ErrInconsistantClosedState = errors.New("inconsistant closed state")
76 ErrUnknownPathsVersion = errors.New("unknown paths version")
77 )
78