From cd4517ba69e26c96a69e505e305a6d0152972982 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krystian=20Bac=C5=82awski?= Date: Mon, 13 Mar 2023 20:48:47 +0100 Subject: [PATCH] Parse DRNG (palette cycling) chunk in ILBM format --- tools/iff/ilbm/drng.go | 84 ++++++++++++++++++++++++++++++++++++++++++ tools/iff/ilbm/ilbm.go | 1 + 2 files changed, 85 insertions(+) create mode 100644 tools/iff/ilbm/drng.go diff --git a/tools/iff/ilbm/drng.go b/tools/iff/ilbm/drng.go new file mode 100644 index 00000000..7dfeed9c --- /dev/null +++ b/tools/iff/ilbm/drng.go @@ -0,0 +1,84 @@ +package ilbm + +import ( + "bytes" + "ghostown.pl/iff" + "log" + "text/template" +) + +const drngTemplate = `{ + Min: {{.Min}}, + Max: {{.Max}}, + Rate: {{.Rate}}, + Flags: {{if .Flags}} RNG_ACTIVE {{- else}} NONE {{- end}}, + DColor: { {{- range .Dcolor }} {{ .Cell}}: {{ printf "#%02x%02x%02x" .R .G .B}}, {{ end -}} }, + DIndex: { {{- range .Dindex }} {{.Cell}}: {{.Index}}, {{ end -}} } +}` + +type DColor struct { + Cell uint8 + R uint8 + G uint8 + B uint8 +} + +type DIndex struct { + Cell uint8 + Index uint8 +} + +type DRNG struct { + Min uint8 + Max uint8 + Rate int16 + Flags int16 + Dcolor []DColor + Dindex []DIndex +} + +func (drng DRNG) Name() string { + return "DRNG" +} + +func (drng *DRNG) Read(r iff.Reader) { + drng.Min = r.ReadU8() + drng.Max = r.ReadU8() + drng.Rate = r.ReadI16() + drng.Flags = r.ReadI16() + ntrue := r.ReadU8() + nregs := r.ReadU8() + + drng.Dcolor = make([]DColor, ntrue, ntrue) + for i := 0; uint8(i) < ntrue; i++ { + drng.Dcolor[i].Cell = r.ReadU8() + drng.Dcolor[i].R = r.ReadU8() + drng.Dcolor[i].G = r.ReadU8() + drng.Dcolor[i].B = r.ReadU8() + } + + drng.Dindex = make([]DIndex, nregs, nregs) + for i := 0; uint8(i) < nregs; i++ { + drng.Dindex[i].Cell = r.ReadU8() + drng.Dindex[i].Index = r.ReadU8() + } +} + +func (drng DRNG) String() string { + t, err := template.New("drng_chunk").Parse(drngTemplate) + if err != nil { + log.Fatal(err) + } + + var out bytes.Buffer + err = t.Execute(&out, drng) + if err != nil { + log.Fatal(err) + } + + return out.String() +} + +func makeDRNG() iff.Chunk { + return &DRNG{} +} diff --git a/tools/iff/ilbm/ilbm.go b/tools/iff/ilbm/ilbm.go index 9217d9eb..36610d19 100644 --- a/tools/iff/ilbm/ilbm.go +++ b/tools/iff/ilbm/ilbm.go @@ -9,6 +9,7 @@ func init() { iff.ParsedChunks["CMAP"] = makeCMAP iff.ParsedChunks["BODY"] = makeBODY iff.ParsedChunks["CAMG"] = makeCAMG + iff.ParsedChunks["DRNG"] = makeDRNG // Ignore JUNK chunk iff.IgnoredChunks["JUNK"] = true