-
Notifications
You must be signed in to change notification settings - Fork 0
/
cel.go
100 lines (94 loc) · 2.71 KB
/
cel.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package transform
import (
"bytes"
"encoding/binary"
"io"
"github.com/SnareChops/aseprite-loader/ase"
"github.com/SnareChops/aseprite-loader/internal"
"github.com/SnareChops/aseprite-loader/trace"
)
func transformCel(in io.Reader, out io.Writer, chunkSize uint32, colorDepth uint16) (data internal.Cel, err error) {
trace.Log("transformCel")
var header ase.CelChunk
header, err = transform[ase.CelChunk](in, out)
if err != nil {
return
}
data.LayerIndex = header.Index
data.X = int(header.XPosition)
data.Y = int(header.YPosition)
data.Opacity = header.Opacity
data.Type = internal.CelType(header.Type)
data.ZIndex = header.ZIndex
remainingSize := chunkSize - 16
switch data.Type {
case 0:
data.Image, err = transformRawImage(in, out, colorDepth)
case 1:
data.Link, err = transform[uint16](in, out)
case 2:
data.Image, err = transformCompressedImage(in, out, remainingSize)
case 3:
data.Tilemap, err = transformCompressedTilemap(in, out, remainingSize)
}
return
}
func transformRawImage(in io.Reader, out io.Writer, colorDepth uint16) (data internal.CelImage, err error) {
trace.Log("transformRawImage")
var header ase.RawImageCel
header, err = transform[ase.RawImageCel](in, out)
if err != nil {
return
}
data.Width = int(header.Width)
data.Height = int(header.Height)
data.Bytes, err = transformBytes(in, out, header.Width*header.Height*(colorDepth/8))
return
}
func transformCompressedImage(in io.Reader, out io.Writer, size uint32) (data internal.CelImage, err error) {
trace.Log("transformCompressedImage")
var header ase.CompressedImageCel
header, err = transform[ase.CompressedImageCel](in, out)
if err != nil {
return
}
data.Width = int(header.Width)
data.Height = int(header.Height)
var compressed []byte
compressed, err = transformBytes(in, out, size-4)
if err != nil {
return
}
data.Bytes, err = decompress(compressed)
return
}
func transformCompressedTilemap(in io.Reader, out io.Writer, size uint32) (data internal.CelTilemap, err error) {
trace.Log("transformCompressedTilemap")
var header ase.CompressedTilemapCel
header, err = transform[ase.CompressedTilemapCel](in, out)
if err != nil {
return
}
data.Width = header.Width
data.Height = header.Height
data.BitsPerTile = header.BitsPerTile
data.TileIDMask = header.TileIDMask
data.XFlipMask = header.XFlipMask
data.YFlipMask = header.YFlipMask
data.DFlipMask = header.DFlipMask
var compressed []byte
compressed, err = transformBytes(in, out, size-32)
if err != nil {
return
}
raw, err := decompress(compressed)
if err != nil {
return
}
for i := 0; i < len(raw); i += 4 {
var tile uint32
err = binary.Read(bytes.NewReader(raw[i:i+4]), binary.LittleEndian, &tile)
data.Tiles = append(data.Tiles, tile)
}
return
}