Add a convenient entry point to test and work on the image serialization code

This commit is contained in:
Kovid Goyal 2025-10-09 19:26:05 +05:30
parent 35093d2105
commit 436ab9a95a
No known key found for this signature in database
GPG key ID: 06BC317B515ACE7C

View file

@ -5,8 +5,10 @@ import (
"encoding/binary"
"fmt"
"image"
"image/color"
"io"
"os"
"slices"
"strings"
"github.com/kovidgoyal/kitty/tools/cli"
@ -68,6 +70,48 @@ func convert_image(input io.ReadSeeker, output io.Writer, format string) (err er
return Encode(output, img, mt)
}
func PalettedToNRGBA(paletted *image.Paletted) *image.NRGBA {
bounds := paletted.Bounds()
nrgba := image.NewNRGBA(bounds)
for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
for x := bounds.Min.X; x < bounds.Max.X; x++ {
c := color.NRGBAModel.Convert(paletted.At(x, y))
nrgba.Set(x, y, c)
}
}
return nrgba
}
func develop_serialize(input_data []byte) (err error) {
img, err := OpenNativeImageFromReader(bytes.NewReader(input_data))
if err != nil {
return err
}
m, b := img.Serialize()
rimg, err := ImageFromSerialized(m, b)
if err != nil {
return err
}
for i := range img.Frames {
a, b := img.Frames[i], rimg.Frames[i]
if a.Img.Bounds() != b.Img.Bounds() {
return fmt.Errorf("bounds of frame %d not equal: %v != %v", i, a.Img.Bounds(), b.Img.Bounds())
}
for y := a.Img.Bounds().Min.Y; y < a.Img.Bounds().Max.Y; y++ {
for x := a.Img.Bounds().Min.X; x < a.Img.Bounds().Max.X; x++ {
or, og, ob, oa := a.Img.At(x, y).RGBA()
nr, ng, nb, na := b.Img.At(x, y).RGBA()
a, b := []uint32{or, og, ob, oa}, []uint32{nr, ng, nb, na}
if !slices.Equal(a, b) {
return fmt.Errorf("pixel at %dx%d differs: %v != %v", x, y, a, b)
}
}
}
}
return
}
func ConvertEntryPoint(root *cli.Command) {
root.AddSubCommand(&cli.Command{
Name: "__convert_image__",
@ -82,6 +126,11 @@ func ConvertEntryPoint(root *cli.Command) {
if _, err = io.Copy(buf, os.Stdin); err != nil {
return 1, err
}
if format == "develop-serialize" {
err = develop_serialize(buf.Bytes())
rc = utils.IfElse(err == nil, 0, 1)
return
}
if err = convert_image(bytes.NewReader(buf.Bytes()), os.Stdout, format); err != nil {
rc = 1
}