limage - xcf/channel.go
1 package xcf
2
3 import "image"
4
5 func (d *decoder) ReadChannel() *image.Gray {
6 width := d.ReadUint32()
7 height := d.ReadUint32()
8
9 d.SkipString() // name
10
11 PropertyLoop:
12 for {
13 typ := d.ReadUint32()
14 plength := d.ReadUint32()
15 switch typ {
16 // general properties
17 case propEnd:
18 if plength != 0 {
19 d.SetError(ErrInvalidProperties)
20 }
21 break PropertyLoop
22 case propLinked:
23 d.SkipBoolProperty()
24 case propLockContent:
25 d.SkipBoolProperty()
26 case propOpacity:
27 if d.ReadUint32() > 255 {
28 d.SetError(ErrInvalidOpacity)
29 }
30 case propParasites:
31 d.SkipParasites(plength)
32 case propTattoo:
33 d.SkipUint32()
34 case propVisible:
35 d.SkipBoolProperty()
36
37 //channel properties
38 case propActiveChannel:
39 // active channel
40 case propColor:
41 d.SkipByte() // r
42 d.SkipByte() // g
43 d.SkipByte() // b
44 case propFloatColour:
45 d.SkipFloat32() // r
46 d.SkipFloat32() // g
47 d.SkipFloat32() // b
48 case propSelection:
49 // selected
50 case propShowMasked:
51 d.SkipBoolProperty()
52 default:
53 d.Skip(plength)
54 }
55
56 }
57
58 var hptr uint64
59 if d.mode < 2 {
60 hptr = uint64(d.ReadUint32())
61 } else {
62 hptr = d.ReadUint64()
63 }
64 d.Goto(hptr)
65
66 im := d.ReadImage(width, height, 2)
67 if im != nil {
68 return im.(*image.Gray) // gray
69 }
70 return nil
71 }
72
73 func (e *encoder) WriteChannel(c *image.Gray) {
74 b := c.Bounds()
75 e.WriteUint32(uint32(b.Dx()))
76 e.WriteUint32(uint32(b.Dy()))
77 e.WriteString("")
78
79 e.WriteUint32(0) // No properties
80 e.WriteUint32(0)
81
82 e.WriteUint32(uint32(e.pos) + 4) // hptr
83 e.WriteImage(c, (*encoder).grayToBuf, 1)
84 }
85