icns

Easily create .icns files (Mac Icons) with this Go library or the included CLI.
Log | Files | Refs | LICENSE

commit cff759cb543a1f59edfad29eba0d57274c35e59b
parent cb4307b7502e9bfa91daae633b6d9212bf1385eb
Author: Jack Mordaunt <jackmordaunt.dev@gmail.com>
Date:   Fri, 18 Sep 2026 16:09:29 -0400

icns: build element headers with encoding/binary

The package carried its own big-endian writer and copied the type field a
byte at a time, which the standard library and copy already do. Sharing
elementHeaderSize with the decoder keeps the encoder's idea of a header from
drifting from the parser's.

Diffstat:
Micns.go | 9---------
Mwriter.go | 17+++++------------
2 files changed, 5 insertions(+), 21 deletions(-)

diff --git a/icns.go b/icns.go @@ -107,15 +107,6 @@ func resizeSquare(img image.Image, size uint, interp InterpolationFunction) imag return dst } -// Big-endian. -// https://golang.org/src/image/png/writer.go -func writeUint32(b []uint8, u uint32) { - b[0] = uint8(u >> 24) - b[1] = uint8(u >> 16) - b[2] = uint8(u >> 8) - b[3] = uint8(u >> 0) -} - var sizes = []uint{ 1024, 512, diff --git a/writer.go b/writer.go @@ -2,6 +2,7 @@ package icns import ( "bytes" + "encoding/binary" "image" "image/png" "io" @@ -59,12 +60,8 @@ func encodeImage(img image.Image) ([]byte, error) { func (i *Icon) writeHeader(wr io.Writer) (int64, error) { if !i.headerSet { defer func() { i.headerSet = true }() - i.header[0] = i.Type.ID[0] - i.header[1] = i.Type.ID[1] - i.header[2] = i.Type.ID[2] - i.header[3] = i.Type.ID[3] - length := uint32(len(i.data) + 8) - writeUint32(i.header[4:8], length) + copy(i.header[:4], i.Type.ID) + binary.BigEndian.PutUint32(i.header[4:8], uint32(len(i.data)+elementHeaderSize)) } written, err := wr.Write(i.header[:8]) return int64(written), err @@ -123,12 +120,8 @@ func (s *IconSet) encodeIcons() error { func (s *IconSet) writeHeader(wr io.Writer) (int64, error) { if !s.headerSet { defer func() { s.headerSet = true }() - s.header[0] = 'i' - s.header[1] = 'c' - s.header[2] = 'n' - s.header[3] = 's' - length := uint32(len(s.data) + 8) - writeUint32(s.header[4:8], length) + copy(s.header[:4], "icns") + binary.BigEndian.PutUint32(s.header[4:8], uint32(len(s.data)+elementHeaderSize)) } written, err := wr.Write(s.header[:8]) return int64(written), err